# 读取配置文件
import yaml
import os
# 导入自定义的模板引擎模块
from template_engine import render_templates
# 获取当前脚本所在目录的绝对路径
script_dir = os.path.dirname(os.path.abspath(__file__))
# 构建配置文件的完整路径
config_path = os.path.join(script_dir, 'config.yml')
def resolve_value(value, config):
    """递归解析值中的变量引用"""
    if isinstance(value, str):
        # 查找${...}格式的变量
        start = value.find('${')
        while start != -1:
            end = value.find('}', start)
            if end == -1:
                break  # 不完整的变量引用，忽略
            
            # 提取变量名，如"template.output_vue_dir"
            var_name = value[start+2:end]
            # 从配置中获取变量值
            var_value = config
            for part in var_name.split('.'):
                if isinstance(var_value, dict) and part in var_value:
                    var_value = var_value[part]
                else:
                    var_value = None
                    break
            
            # 替换变量
            if var_value is not None:
                value = value[:start] + str(var_value) + value[end+1:]
                start = value.find('${', start + len(str(var_value)))
            else:
                start = value.find('${', end)
    elif isinstance(value, dict):
        # 递归处理字典
        for k, v in value.items():
            value[k] = resolve_value(v, config)
    elif isinstance(value, list):
        # 递归处理列表
        for i in range(len(value)):
            value[i] = resolve_value(value[i], config)
    return value
with open(config_path, 'r', encoding='utf-8') as file:
    config = yaml.safe_load(file)
    config = resolve_value(config, config)

# 打印配置
# print(config)
# 读取Excel文件
import pandas as pd
from openpyxl import load_workbook

# 使用openpyxl打开Excel文件以检查sheet的可见性
workbook = load_workbook(config['excel_file'])

# 获取所有不隐藏的sheet名称
visible_sheets = []
for sheet_name in workbook.sheetnames:
    sheet = workbook[sheet_name]
    # 检查sheet是否可见 (visible sheet_state)
    # sheet_state can be 'visible', 'hidden', or 'veryHidden'
    if sheet.sheet_state == 'visible':
        visible_sheets.append(sheet_name)

print(f"Excel文件包含以下sheet: {workbook.sheetnames}")
print(f"可见的sheet: {visible_sheets}")
print(f"将处理 {len(visible_sheets)} 个可见的sheet")

# 循环处理每个可见的sheet
for sheet_name in visible_sheets:
    print(f"\n开始处理sheet: {sheet_name}")
    
    # 读取当前sheet的数据
    df = pd.read_excel(config['excel_file'], sheet_name=sheet_name, header=None)
    df = df.where(pd.notna(df), None)
    # 打印数据
    # print(df)
    table_name = df.iloc[1][0]
    table_comm = df.iloc[1][1]
    package_name = df.iloc[1][2]
    db_model = df.iloc[1][3]
    # 打印第一行,获取第一行指定列的数据
    print(f"表名: {table_name}, 表注释: {table_comm},包名：{package_name}, 数据库模型: {db_model}")
    
    data = df.iloc[2]
    # 从第三行开始处理数据
    df2 = df[config['excel_config']['start_row']:] 
    
    # 更简洁的实现方式构建列信息数组
    arr = []
    for index,row in df2.iterrows():
        m = dict(zip(data, row))
        arr.append(m)
    print(f"当前sheet共处理 {len(arr)} 行数据")
    
    # 调用模板引擎模块中的函数来处理模板渲染和文件生成
    generated_files = render_templates(config,db_model, table_name, table_comm, arr, script_dir,True,package_name)
    print(f"sheet {sheet_name} 处理完成，共生成 {len(generated_files)} 个文件")